package com.bw.shopping.service.impl;

import com.bw.shopping.domain.NewShoppingCart;
import com.bw.shopping.domain.PmsBrand;
import com.bw.shopping.mapper.NewShoppingCartMapper;
import com.bw.shopping.service.NewShoppingCartService;
import com.bw.shopping.vo.Cart;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.math.BigDecimal;
import java.util.*;

/**
 * @Author：尚志豪
 * @Package：com.bw.goods.service.impl
 * @Project：ruoyiszh
 * @name：DetailsInformationServiceImpl
 * @Date：2024/12/23 20:34
 */
@Service
public class NewShoppingCartServiceImpl implements NewShoppingCartService {

    @Autowired
    private NewShoppingCartMapper newShoppingCartMapper;
    @Autowired
    private Jedis jedis;
    @Autowired
    @Qualifier("customRedisTemplate")
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 添加购物车功能【插入】
     */
    @Override
    public void addShoppingCartFunction(NewShoppingCart newShoppingCart) {
        newShoppingCartMapper.addShoppingCartFunction(newShoppingCart);
    }

    /** 添加购物车项 **/
    @Override
    public void addToCart(NewShoppingCart cartItem) {
        // 构建用户购物车的Redis键，格式为"user:用户ID:cart"
        String userCartKey = "user:" + cartItem.getUserId() + ":cart";
        // 构建商品在购物车中的Redis键，格式为"user:用户ID:cart:SKUID"
        String skuKey = userCartKey + ":" + cartItem.getSkuId();
        // 检查Redis中是否已经存在该商品的记录
        if (jedis.hexists(skuKey, "skuId")) {
            // 如果存在，获取当前商品数量，注意这里有一个错误：jedis.hget返回的是String类型，直接比较"null"是不正确的
            // 应该先判断返回的字符串是否为null或空字符串，再转换为Long类型
            Long currentNumber = jedis.hget(skuKey, "number").equals("null") ? 0L : Long.parseLong(jedis.hget(skuKey, "number"));
            // 更新商品数量
            jedis.hset(skuKey, "number", String.valueOf(currentNumber + cartItem.getNumber()));
        } else {
            // 如果不存在，创建一个新的商品记录
            Map<String, String> map = new HashMap<>();
            // 设置商品的各种属性，包括用户ID、店铺ID、店铺名称、SKU ID、SKU名称、SKU标题、SKU默认图片、属性名、属性值选择、数量、价格
            map.put("userId", String.valueOf(cartItem.getUserId()));
            map.put("shopsId", String.valueOf(cartItem.getShopsId()));
            map.put("shopsName", cartItem.getShopsName());
            map.put("skuId", String.valueOf(cartItem.getSkuId()));
            map.put("skuName", cartItem.getSkuName());
            map.put("skuTitle", cartItem.getSkuTitle());
            map.put("skuDefaultImg", cartItem.getSkuDefaultImg());
            map.put("attrName", cartItem.getAttrName());
            map.put("valueSelect", cartItem.getValueSelect());
            map.put("number", String.valueOf(cartItem.getNumber()));
            map.put("price", cartItem.getPrice().toString());
            // 使用hmset方法将商品记录存储到Redis中，注意：jedis 3.x版本后hmset已被废弃，应使用hset(key, map)替代
            jedis.hmset(skuKey, map);
        }
    }

    /** redis查询出的结构要进行结构转换 */
    @Override
    public Cart getCartFromRedis(String userId) {
        // 构建Redis中存储用户购物车信息的键前缀
        String userCartKeyPrefix = "user:" + userId + ":cart:";
        // 使用jedis客户端查询Redis中所有匹配该前缀的键，这些键代表用户的购物车中各个商品的信息
        Set<String> skuKeys = jedis.keys(userCartKeyPrefix + "*");
        // 如果没有找到任何匹配的键，说明该用户的购物车为空，返回null
        if (skuKeys.isEmpty()) {
            return null;
        }
        // 创建一个列表来存储解析出来的购物车商品信息
        List<NewShoppingCart> newShoppingCartList = new ArrayList<>();
        // 遍历所有找到的购物车商品键
        for (String skuKey : skuKeys) {
            // 从Redis中获取该商品键对应的哈希表，包含商品的所有信息
            Map<String, String> skuHashMap = jedis.hgetAll(skuKey);
            // 创建一个新的NewShoppingCart对象来存储单个商品的信息
            NewShoppingCart cartItem = new NewShoppingCart();
            // 设置商品的用户ID（注意这里从Redis获取的是字符串，需要转换为Long类型）
            cartItem.setUserId(Long.parseLong(skuHashMap.get("userId")));
            // 设置商品的店铺ID
            cartItem.setShopsId(Long.parseLong(skuHashMap.get("shopsId")));
            // 设置店铺名称
            cartItem.setShopsName(skuHashMap.get("shopsName"));
            // 设置商品的SKU ID
            cartItem.setSkuId(Long.parseLong(skuHashMap.get("skuId")));
            // 设置商品名称
            cartItem.setSkuName(skuHashMap.get("skuName"));
            // 设置商品的标题
            cartItem.setSkuTitle(skuHashMap.get("skuTitle"));
            // 设置商品的默认图片
            cartItem.setSkuDefaultImg(skuHashMap.get("skuDefaultImg"));
            // 设置商品的属性名称
            cartItem.setAttrName(skuHashMap.get("attrName"));
            // 设置选中的属性值
            cartItem.setValueSelect(skuHashMap.get("valueSelect"));
            // 设置购买数量
            cartItem.setNumber(Long.parseLong(skuHashMap.get("number")));
            // 设置商品的价格（从Redis获取的是字符串，需要转换为BigDecimal类型）
            cartItem.setPrice(BigDecimal.valueOf(Double.parseDouble(skuHashMap.get("price"))));
            // 将填充好的购物车商品添加到列表中
            newShoppingCartList.add(cartItem);
        }
        // 创建一个Cart对象来存储整个购物车的信息
        Cart cart = new Cart();
        // 如果购物车商品列表不为空，取第一个商品的信息来设置购物车的店铺ID和店铺名称（这里假设所有商品都属于同一个店铺）
        if (!newShoppingCartList.isEmpty()) {
            NewShoppingCart firstCartItem = newShoppingCartList.get(0);
            cart.setShopsId(firstCartItem.getShopsId());
            cart.setShopsName(firstCartItem.getShopsName());
        }
        // 设置购物车商品列表
        cart.setNewShoppingCartList(newShoppingCartList);
        // 返回封装好的购物车对象
        return cart;
    }

    /**
     * 根据id品牌查询名称
     */
    @Override
    public PmsBrand searchForNameBasedOnId(Long shopsId) {
        return newShoppingCartMapper.searchForNameBasedOnId(shopsId);
    }
}
